package leetCode.solution;

import com.alibaba.fastjson.JSON;

/**
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * 
 * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 * 
 * @author jerry
 * @ClassName: Solution48
 * @Description:
 * @date 2022年11月11日 下午6:09:06
 */
class Solution48 {

	public static void main(String[] args) {
		int[][] matrix1 = new int[][] { { 5, 1, 9, 11 }, { 2, 4, 8, 10 }, { 13, 3, 6, 7 }, { 15, 14, 12, 16 } };
		new Solution48().rotate1(matrix1);
		System.out.println(JSON.toJSON(matrix1));
		int[][] matrix2 = new int[][] { { 5, 1, 9, 11 }, { 2, 4, 8, 10 }, { 13, 3, 6, 7 }, { 15, 14, 12, 16 } };
		new Solution48().rotate2(matrix2);
		System.out.println(JSON.toJSON(matrix2));
	}

	public void rotate1(int[][] matrix) {
		int n = matrix.length;
		int tmp = 0;
		for (int i = 0; i < n>>1; i++) {
			for (int j = 0; j < (n+1)>>1; j++) {
			    tmp = matrix[i][j];
				matrix[i][j] = matrix[n - 1 - j][i];
				matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
				matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
				matrix[j][n - 1 - i] = tmp;
			}
		}
	}
	
	public void rotate2(int[][] matrix) {
        int dimension = matrix.length;
        // 首先进行矩阵转置
        for(int i = 0; i < dimension ; i++){
            for( int j = i; j < dimension ; j ++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        // 再进行垂线的镜像对称
        int l = 0, r = dimension - 1;
        while(l < r){
            for(int i = 0; i < dimension;i++){
                int temp = matrix[i][l];
                matrix[i][l] = matrix[i][r];
                matrix[i][r] = temp;
            }
            l++;
            r--;
        }
    }
}